package day5

import (
	"encoding/json"
	"fmt"
	"reflect"
)

/*
转成json的时候 后面的名字会替换前面的名称（前面必须大写，不然会被json格式化丢弃）
*/
type Person struct {
	Name string `json:"name"`
	Age  int `chinaL:"dabai"`
}

/*
struct的方法
名称
大写外部可访问
小写只有本包才能访问
*/
func (this Person) test() {
	fmt.Println(this.Age)
}

/*
实现 string方法，fmt.Println(m) 会自动输出这个
*/
func (m Person) String() string {
	return m.Name + "66666"
}

func tagRun() {
	person := Person { "tom", 12 }

	//json 格式化
	if b, err := json.Marshal(person); err != nil {
		fmt.Printf("error: %s", err.Error())
	} else {
		fmt.Printf("value: %s", b)
	}
	fmt.Println("")

	//反射获取值，获取我tag
	v := reflect.ValueOf(person)
	for i := 0; i < v.NumField(); i++ {
		fieldTag    := v.Type().Field(i).Tag
		fieldName   := v.Type().Field(i).Name
		fieldType   := v.Field(i).Type()
		fieldValue  := v.Field(i).Interface()
		fmt.Println("fieldTag: ",fieldTag)
		fmt.Println("fieldTag.value: ",fieldTag.Get("chinaL"))
		fmt.Println("fieldName: ",fieldName)
		fmt.Println("fieldType: ",fieldType)
		fmt.Println("fieldValue: ",fieldValue)
	}
	//这里是获取指针信息
	kk := 66.6
	fv := reflect.ValueOf(&kk)
	fv.Elem().SetFloat(3.3) //修改指针的变量
	fmt.Println("Elem: ",fv,kk)

	//调用结构体的方法
	person.test()
	fmt.Println(person)
}



